package com.example.werewolf.service.impl.role;

import com.alibaba.fastjson2.JSONObject;
import com.example.werewolf.common.ActionType;
import com.example.werewolf.common.WereWolfPrompt;
import com.example.werewolf.entity.Event;
import com.example.werewolf.entity.GamePhase;
import com.example.werewolf.entity.Player;
import com.example.werewolf.model.ActionSkill;
import com.example.werewolf.model.GameChatResp;
import com.example.werewolf.service.ActionStrategy;
import com.example.werewolf.utils.PrintUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.List;

@Slf4j
@Component
public class SpeechActionStrategy implements ActionStrategy {

    private final String mistakeSpeech = """
            错误发言示例：
                我是8号，悍跳预言家....
                我是6号猎人....
                我是5号女巫，现在必须澄清局势.....
                我是3号，平民身份...我作为平民没有任何查验信息，但我会认真倾听每一位上警玩家的发言逻辑....
            以上直接自爆身份的发言都是错误的。
            
            身份暴露时机：
            游戏前期，预言家可以优先跳出身份来获取警徽，带队投出狼人；
            游戏中后期，在好人视角混乱，被狼人干扰时，为了纠正好人视角，神牌或平民牌可以亮明身份来正好人视角。非紧急情况，神职和平民不要轻易暴露自己的身份
            """;
    @Override
    public ActionSkill execute(List<Player> players, List<Player> actionPlayers,
                               GamePhase phase, List<Event> publicEvents, SseEmitter emitter) throws IOException {
        // 发言顺序默认已排序
        // 找出白天能行动的角色

        for (Player player : actionPlayers) {
            if (!player.isSpeech()) {
                continue;
            }
            // 依次发言：获取私有发言
            List<Event> events = player.getEvents();
            String chat = player.chat(String.format("本局游戏中，你所了解的私有消息：%s, 你所了解的公共发言：%s，" +
                    "一切发言都是为了阵营胜利为前提，可以使用多种战术，例如：%s，请不要出现一下错误发言 %s，。综上结合当前身份和信息，给出发言：",
                    events, publicEvents, WereWolfPrompt.GAME_TACTICS, mistakeSpeech));
            GameChatResp resp = parseResponse(chat);

            // 发言
            PrintUtils.printPlayer(emitter, player, resp.getContent());
            log.info(resp.getContent());
            publicEvents.add(Event.builder()
                    .type("public")
                    .description(resp.getContent())
                    .build());

            // 其他角色行动（骑士戳人，狼王刀人，狼人自爆，若不行动则不记忆；若行动，记录公共发言）
            log.info("白天能施放技能的角色：{}", phase.getAvailableRolesWithSkills().toString());
        }

//        String message = "";
//        String acceptPlayer = "";
//        try {
//            emitter.send(SseEmitter.event()
//                    .data(MessageRecord.builder()
//                            .text(message)
//                            .time(LocalDateTime.now().toString())
//                            .type("phase")
//                            .build())
//            );
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//
//        List<Player> acceptPlayers = RoleUtils.getRoleplayer(players, acceptPlayer);
//        List<Integer> acceptPlayerIds = acceptPlayers.stream().map(Player::getId).toList();
//        for (Player player : acceptPlayers) {
//            player.addEvent(Event.builder().description(acceptPlayer).affectedPlayer(acceptPlayerIds).build());
//        }
        return ActionSkill.builder()
                .actionType(ActionType.SPEECH)
                .build();
    }

    private GameChatResp parseResponse(String json) {
        try {
            return JSONObject.parseObject(json, GameChatResp.class);
        } catch (Exception e) {
            System.err.println("玩家发言解析响应失败: " + e.getMessage());
            return null;
        }
    }
}
